import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from  '@/store'
Vue.use(VueRouter)
// 重写push 和 replace  方法
let originpush = VueRouter.prototype.push;
let originreplace = VueRouter.prototype.replace; 
VueRouter.prototype.push = function(location,reslove,reject){
    if(reslove&&reject){
        originpush.call(this,location,reslove,reject)
    }else{
        originpush.call(this,location,()=>{},()=>{})
    }
}
VueRouter.prototype.replace = function(location,reslove,reject){
    if(reslove&&reject){
        originreplace.call(this,location,realove,reject)
    }else{
        originreplace.call(this,location,()=>{},()=>{})
    }
}
const router =new VueRouter({
    routes,
    scrollBehavior (to, from, savedPosition) {
        return { x: 0, y: 0 }
      }
})

router.beforeEach(async (to,from,next)=>{
    // 获取token 判断是否登录
        let token = store.state.user.token;
    //  获取用户信息 判断是否有用户信息  如果在组组件里面法请求会降低速度  在这可以直接判断并发请求
        let name = store.state.user.userInfo.name
        if(token){
            if(to.path == '/login'){
                next('/home');
            }else{
                if(name){
                    // 登录后并且有用户名就想去哪都行  如果没有就会去发送请求  因为刷新页面
                    next();
                }else{
                    try{
                        await store.dispatch('getUserInfo');
                        next();
                    }catch(error){
                        // token失效或者退出登录
                        await store.dispatch('loginOut');
                        //清除本地数据之后，让用户回到登录页，重新登录、获取新的token
                        next('/login');
                    }
                }
            }
        }else{
            // 去哪里都行
            next()
        }
})

export default router;